package aterrizar;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Random;

import exceptions.NuevaPasswordInvalidaException;
import exceptions.UsuarioNoExisteException;
import exceptions.UsuarioNoValidadoException;
import exceptions.UsuarioYaExisteException;
import exceptions.ValidacionException;


public class RepoUsuarios {

	Mensajero mensajero= new Mensajero();
	
	/**Proposito:
	 * 		Recibe un usuario por parametro, lo registra en la base de datos y envia el mail correspondiente
	 *  con el codigo de validacion.
	 * 
	 * @param usuario
	 * @throws UsuarioYaExisteException
	 * @throws SQLException
	 * @throws Exception
	 */
	public void registrarUsuario(Usuario usuario) throws UsuarioYaExisteException, SQLException,Exception {
		int passGen;
		Random randomNum= new Random();
		this.mensajero.enviarMailA(usuario.getEmail(),randomNum.toString());
		
		Connection conexionBD = AdministradorDeConexion.obtenerConexion();
		PreparedStatement queryUser = conexionBD.prepareStatement("SELECT nombreDeUsuario FROM usuario WHERE nombreDeUsuario = ? ;");
		queryUser.setString(1, usuario.getNombreDeUsuario());
		ResultSet rs = queryUser.executeQuery();
		
			if(rs.next()){	
				conexionBD.close();
				throw new UsuarioYaExisteException();
			} else {
					passGen=randomNum.nextInt();
		
				PreparedStatement queryInsert= conexionBD.prepareStatement("INSERT INTO usuario VALUES (?,?,?,?,?,?,?,?)");
					queryInsert.setString(1, usuario.getNombre());
					queryInsert.setString(2, usuario.getApellido());
					queryInsert.setString(3, usuario.getNombreDeUsuario());
					queryInsert.setDate(4, usuario.getFechaDeNacimiento());
					queryInsert.setString(5, usuario.getEmail());
					queryInsert.setString(6, usuario.getPassword());
					queryInsert.setInt(7, passGen);
					queryInsert.setBoolean(8, false);
					queryInsert.executeUpdate();
	
				conexionBD.close();
			}
	}
	
	/**
	 * Proposito:
	 *  	Se encarga de validar la cuenta de un usuario determinado (el nombre viene como argumento) y 
	 *  	verifica que el codigo de verificación dado coincida con el que almacenó el sistema.
	 * @param userName
	 * @param codigoValidacion
	 * @throws ValidacionException
	 * @throws Exception
	 */
	public void validarCuenta(String userName, String codigoValidacion) throws ValidacionException,Exception{

			Connection conexionBD = AdministradorDeConexion.obtenerConexion();
			PreparedStatement queryUser = conexionBD.prepareStatement("SELECT * FROM usuario WHERE nombreDeUsuario = ?;" );
			queryUser.setString(1, userName);
			ResultSet rs= queryUser.executeQuery();
			rs.next();
			boolean estadoDeValidacion = rs.getBoolean("estadoDeValidacion");
			String codVal = rs.getString("codValidacion");
			if(!estadoDeValidacion && codVal.equalsIgnoreCase(codigoValidacion)){
				PreparedStatement queryUpdate = conexionBD.prepareStatement("UPDATE usuario SET estadoDeValidacion = ? WHERE nombreDeUsuario = ? AND codValidacion = ?;");
				queryUpdate.setBoolean(1, true);
				queryUpdate.setString(2, userName);
				queryUpdate.setString(3,codigoValidacion);
				queryUpdate.executeUpdate();
			}else{
				
				throw new ValidacionException();
			}
			conexionBD.close();			
			
	}
	
	/**
	 * Proposito: 
	 * 		Permite que el usuario se identifique ingresando su nombre de usuario y su password correspondiente.
	 * @param userName
	 * @param password
	 * @throws UsuarioNoExisteException
	 * @throws UsuarioNoValidadoException
	 * @throws Exception
	 */
	public void ingresarUsuario(String userName, String password) throws UsuarioNoExisteException,UsuarioNoValidadoException,Exception{
		Connection conexionBD = AdministradorDeConexion.obtenerConexion();
		PreparedStatement queryUser = conexionBD.prepareStatement("SELECT * FROM usuario WHERE nombreDeUsuario = ? AND password = ? AND estadoDeValidacion = ?");
		queryUser.setString(1, userName);
		queryUser.setString(2, password);
		queryUser.setBoolean(3, true);
		
		try{
			ResultSet resultUser= queryUser.executeQuery();
				if(resultUser.next()){
					System.out.println("Logueado Exitosamente.");
				}else{
					throw new UsuarioNoExisteException();
				}
			conexionBD.close();
		}catch (SQLException e){
			conexionBD.close();
		}
	}
	
	
	
	/**
	 * Proposito:
	 * 		Metodo utilizado para cambiar la password del usuario almacenada en el sistema.
	 * @param userName
	 * @param password
	 * @param nuevaPassword
	 * @throws NuevaPasswordInvalidaException
	 * @throws Exception
	 */
	public void cambiarPassword(String userName,String password, String nuevaPassword)throws NuevaPasswordInvalidaException, Exception{
		if(password.equals(nuevaPassword)){
			throw new NuevaPasswordInvalidaException();
		}
		else {
			Connection conexionBD = AdministradorDeConexion.obtenerConexion();		
		    try{
			  	PreparedStatement queryUpdate = conexionBD.prepareStatement("UPDATE usuario SET password = ? WHERE nombreDeUsuario = ?");
			  	queryUpdate.setString(1, nuevaPassword);
			  	queryUpdate.setString(2, userName);
			  	queryUpdate.executeUpdate();
			  	conexionBD.close();
		  		} catch(SQLException e){
		  			conexionBD.close();
		  		}
		}
	}

	

}
